package com.LeeCode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 岛屿数量
 */
public class Code200 {
    public static void main(String[] args) {
        char[][] grid = {{'1', '1', '1', '1', '0'},
                {'1', '1', '0', '1', '0'},
                {'1', '1', '0', '0', '0'},
                {'0', '0', '0', '0', '0'}};

        System.out.println(new Code200().numIslands(grid));
    }

    public int numIslands(char[][] grid) {
        int nr = grid.length;
        int nc = grid[0].length;
        int num_islands = 0;

        for (int r = 0; r < nr; ++r) {
            for (int c = 0; c < nc; ++c) {
                if (grid[r][c] == '1') {
                    ++num_islands;
                    grid[r][c] = '0';
                    Queue<Integer> neighbors = new LinkedList<>();
                    neighbors.add(r * nc + c);
                    while (!neighbors.isEmpty()) {
                        int id = neighbors.remove();
                        int row = id / nc;
                        int col = id % nc;
                        if (row - 1 >= 0 && grid[row-1][col] == '1') {
                            neighbors.add((row-1) * nc + col);
                            grid[row-1][col] = '0';
                        }
                        if (row + 1 < nr && grid[row+1][col] == '1') {
                            neighbors.add((row+1) * nc + col);
                            grid[row+1][col] = '0';
                        }
                        if (col - 1 >= 0 && grid[row][col-1] == '1') {
                            neighbors.add(row * nc + col-1);
                            grid[row][col-1] = '0';
                        }
                        if (col + 1 < nc && grid[row][col+1] == '1') {
                            neighbors.add(row * nc + col+1);
                            grid[row][col+1] = '0';
                        }
                    }
                }
            }
        }

        return num_islands;
    }

    public int numIslands1(char[][] grid) {
        if(grid == null || grid.length == 0){
            return 0;
        }
        int nR = grid.length;
        int nC = grid[0].length;
        int num_islands = 0;

        for(int r = 0; r < nR ; r++){
            for(int c = 0; c < nC; c++){
                if(grid[r][c] == '1'){
                    num_islands++;
                    dfs(grid,r,c);
                }
            }
        }
        return num_islands;

    }
    private void dfs(char[][] grid, int r, int c){
        int nR = grid.length;
        int nC = grid[0].length;

        if(r<0 || c<0 ||r>=nR || c>=nC || grid[r][c] == '0'){
            return;
        }
        grid[r][c] = '0';
        dfs(grid,r-1,c);
        dfs(grid,r+1,c);
        dfs(grid, r, c-1);
        dfs(grid, r, c+1);
    }
}
